#include<iostream>

using namespace std;

// 然而，在某些情况下，前置声明是不够的。在你的例子中，Derived 类包含一个 Component类的实例，
// 而不是指针或引用。编译器在处理 Derived 类时需要知道 Component 类的大小和布局信息，以便
// 正确地分配内存和生成代码。由于前置声明并没有提供足够的信息，编译器无法在这种情况下进行编译。
// class Component;

// component in derived
class Component {
public:
    Component() { cout << "Component Ctor" << endl; }
    ~Component() { cout << "Component Dtor" << endl; }
};

class Base {
public:


    Base() { cout << "Base Ctor" << endl; }
    ~Base() { cout << "Base Dtor" << endl; }
};
 
class Derived : public Base {
public:
    Component c;

    Derived() { cout << "Derived Ctor" << endl; }
    ~Derived() { cout << "Derived Dtor" << endl; }
};

int main() {
    Derived de;

    return 0;
}